package dao;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;

public class Dao<T> {
    private static EntityManager em = Persistence.createEntityManagerFactory("UP").createEntityManager();
    private Class classe;

    public Dao(Class classe) {
        this.classe = classe;
    }
            
    public void insert(T entidade) {
        System.out.println("INSERT: "+  classe.getSimpleName() + " - " + entidade.toString());
        em.getTransaction().begin();
        em.merge(entidade);
        em.getTransaction().commit();
    }
    
    public void remove(int id) {
        System.out.println("REMOVE: "+ classe.getSimpleName() + " - " +id);
        T entidade = get(id);
        if (entidade == null) {
            return;
        }
        em.getTransaction().begin();
        em.remove(entidade);
        em.getTransaction().commit();
    }
    
    public void update(T entidade) {
        System.out.println("UPDATE: "+ classe.getSimpleName() + " - " + entidade.toString());
        em.getTransaction().begin();
        em.merge(entidade);
        em.getTransaction().commit();
    }
    
    public T get(int id) {
        return (T)em.find(classe, id);
    }
    
    public List<T> list() {
        System.out.println("LIST: " + classe.getSimpleName());
        return em.createQuery("SELECT e FROM "+ classe.getSimpleName() + " e").getResultList();
    }
    
    public void close() {
        em.close();
    }
    
    public static EntityManager getEm() {
        return em;
    }
}
